PikiGENConverterを使った初代ピクミンのステージエディット




本ページでは、自作プログラム「PikiGENConverter」を使い、初代ピクミンのGENファイルを編集し
ステージ内に配置するオブジェクト(パーツ・原生生物・ペレット等)を
自由に追加・変更を行う方法を紹介する。このプログラムは
プログラミング初心者が作成した故に、実行環境によっては想定外の不具合が発生してしまう
場合があることを了承してほしい。またゲームの内部データに手を加える前提で記述を行っているため、
「ゲームディスクのバックアップ方法」や「バックアップしたディスクイメージの編集方法」といった
予備知識があらかじめ必要となる。ゲームキューブのディスクイメージ編集方法に関しては
こちらのページを参考にするとよいかもしれない

「PikiGENConverter」をダウンロード

※32bitのOSを利用している場合は「32bit」フォルダ内にある実行ファイルを使うこと。
(一括変換のバッチファイルは64bit/32bitのどちらでも利用可能。)



~GENファイル・GENinfoファイルの変換方法~

このプログラムはCUIプログラムなのでコマンドを入力して操作を行う。

個別に変換を行う場合は、「PikiGENConverter.exe」を実行し「1」を入力してEnter、
GENファイルへのディレクトリパスを入力。(拡張子は省くこと)

「===GEN Convert→GENinfo:OK===」というメッセージが表示されたら変換完了。
変換したGENinfoファイルを元のGEN形式へ変換する場合は、「2」を入力して同様の手順を踏む。
一括変換を行いたい場合は「PikiGENConverter.exe」と「GEN一括変換.bat」あるいは「GENinfo一括変換.bat」を
ゲームディスクのイメージから抽出した「dataDir」フォルダへ配置。
そして「GEN一括変換.bat」か「GENinfo一括変換.bat」を実行すればよい。



~GENファイルの種類について~

GENファイルの種類は、ステージを開始する度に毎回読み込まれる「default.gen」と、
そのステージに初めて訪れた際にのみ読み込まれる「init.gen」、
指定された日付のみ使用される「0.gen~29.gen」、
植物の配置情報が書かれた「plants.gen」の四つが存在する。

「default.gen」はオニヨンやドルフィン号といったオブジェクトの配置情報が記されており、
「init.gen」にはパーツや壁などの情報が書かれていて、二回目以降はセーブデータから読み込まれる。

編集するGENファイルはどちらでも構わないが、編集したinit.genを反映させるには
"対象のステージに訪れる前のセーブデータ"が必要となることに注意が必要である。

チャレンジモードではステージを開始する度に「default.gen」と「plants.gen」が必ず読み込まれるので、
確認が比較的容易に行えると言えるかもしれない。
なので本ページではチャレンジモードの遭難地点(chal0)で使われる「default.gen」を使って
基本的な編集方法を記すことにした。



~GENの編集・オブジェクトの追加手順~

まずは全てのGENファイルを一括変換しておこう。
「GEN一括変換.bat」と「PikiGENConverter.exe」が置かれたフォルダに、
ピクミンのディスクイメージ内にある「dataDir」内にある「stages」を抽出しておく。
編集手順1

抽出が終わったら「GEN一括変換.bat」を実行する。

変換が完了したら、「stages」内の「chal0」フォルダにある
「default.GENinfo」をメモ帳で開く。

今回は、チャレンジモードでは本来出現しないはずの
ドルフィン号とパーツのオブジェクト情報を追加してみることにした。

ドルフィン号の情報とパーツ情報の"二つ"のオブジェクトを追加するので、
オブジェクト総計数である「OBJECT_COUNT:」の数値を"82"に変更しておく。
編集手順2
編集手順3

ドルフィン号の情報を「practice」フォルダの「default.GENinfo」からコピーする。
(対象はOBJECT[4](オブジェクト番号4番目)のデータ)
編集手順4

コピーを行ったら、編集中のGENinfo(chal0のdefault.GENinfo)に切り替え
「★_END」が見えるまでスクロール。
編集手順5

「★_END」を超えない範囲内にコピーしたデータを貼り付ける。
(「★_END」はGENinfoデータの終わりを表すため、それ以降に記述を行うと無意味となってしまう。)

貼り付けた後はオブジェクト番号を"4"から"81"に変更。
これでドルフィン号の配置は完了となる。
編集手順6
編集手順7

続いてパーツ情報のコピーへ進む。
「practice」フォルダの「init.GENinfo」を開き、オブジェクト番号1の情報を指定しコピー。
編集手順8

ドルフィン号の配置と同様の手順で貼り付けを行い、オブジェクト番号を"1"から"82"に変更する。

<
編集を終えたら上書き保存を行い、「PikiGENConverter.exe」を実行。
半角で「2」を入力しEnterを押す。
編集手順9

先ほど編集を行ったGENinfoファイルへのディレクトリパスを"拡張子は含めずに"入力しEnter。
(プログラムが停止してしまった場合、編集中にミスがあったかバグが発生している可能性が考えられる。)
編集手順10

「===GENinfo Convert→GEN:OK===」という表示がされたならば変換が正常完了された合図だ。
編集手順11

変換されたGENファイルをディスクイメージ内にインポートしてゲーム内での動作を確認してみよう。
エミュレーターを使うもよし、バックアップ起動が行える実機でやるもよし、自分に合った方法で確認だ。
編集手順12

インポート時にエラーが発生してしまう場合は、
このページの「~書き換え先よりも大きいサイズのファイルを取り込む場合~
を参考に書き換え操作を行うべし。「root」の「Export」操作で躓いた場合は
「.NET Framework 3.5」をインストールし、再起動を行ってみたりすると解決することがある。

チャレンジモードの遭難地点に、ドルフィン号とそのパーツであるメインエンジンが追加されていれば成功!
編集手順13
編集手順14


~特定の場所にオブジェクトを配置する・パーツの種類を変更してみる~

続いて、オブジェクトの配置場所・パーツの種類を変更する方法に入ろう。

オブジェクト配置場所は、「POINT_SAYUU」と
「POINT_OKUYUKI」の値("0x"が付くものは十六進数)によって決められている。
操作手順15
操作手順16

その値を得るには、PikiGENConverterが圧縮されていたZIPファイルにある
「ZAHYOU」ファルダの画像を参考に取得しなければならない。

これら画像は各ステージに対応した大雑把な座標図なのであるが、
あくまでも「だいたいこの位置かな」という程度の目安のためズレが生じることが多いのが難点。

遭難地点の座標図は「tutorialX3_ZAHYOU.png」。
まずはこれを任意の画像編集ソフト(ペイントなど)で開こう。

開いたら早速、配置したい場所に何か印を付けておく。
(今回は確認がしやすいようにオニヨン類の中心を選んだ。)

印を付けたら、目安に向かって縦と横の直線を引く。
操作手順17

赤の目安は「POINT_SAYUU」、青は「POINT_OKUYUKI」。
「POINT_SAYUU」は「0xC340」と「0xC330」の中間を指しているので「0xC33A」、
「POINT_OKUYUKI」の場合は「0x44B0」より少し下を指しているため「0x44AE」ということにしておく。

これで大まかな配置場所の値を取得することができたので、さっそく前回に編集したGENinfoを開いて、
オブジェクト番号82の情報を編集だ。

「POINT_SAYUU」と「POINT_OKUYUKI」を先ほど得た値に変更。
操作手順18
操作手順19

変更が済んだら次はパーツの種類を変更してみる。
「PELT_TYPE:"ust5"」の"ust5"を、peltリストを参照してお好みのパーツに変えてみよう。
操作手順20

今回は何となく"uf03"のガードサテライトを選ぶことにした。
操作手順21

ここまでの変更を完了させたら上書き保存を行い、前回と同じように編集したGENinfoファイルの変換を行う。
そして同じく、変換されたGENファイルを再びディスクイメージにインポート。

ゲーム内で確認を行い、変更が反映されていたら成功だ。
なお配置場所が気に食わない場合は、今のところ値を調節しながらGENinfoの変換とインポートを繰り返すしかない。
操作手順22

ここまでの手順を応用していけば、任意のオブジェクトを自由に配置することができる。
"オブジェクト情報は基本的にコピー&ペーストを行う"、
"配置位置は座標図を見て決める"と覚えておけばよいかもしれない。


最後に、現時点でのGENinfoの仕様や幾つかのパラメーターに関する情報、原生生物リスト等を記しておく。


~GENinfoの仕様~

☆_GEN:GENinfoファイルの開始
これがないと変換プログラムでの認識が行えなくなるので手を加えないこと。

UNKNOWN_DATA1:不明データ1
このデータは、どんな役割を持つのか不明であるためバイナリをテキストとして書き出している。
下手にいじくるとゲーム内にてフリーズが生じるので基本的には変更しなくてよい。

OBJECT_COUNT:登録されているオブジェクトの総計
名前の通りオブジェクトの総計数をカウントしている。
新たなオブジェクト情報を追記した場合は、"追記した数だけ"この数値を足しておかねばならない。

OBJECT[x]:オブジェクト番号
xは何番目に登録されているオブジェクトであるかを表す。
順番通りに正しく記入しなければ不具合の起因となるので注意が必要である。

{:オブジェクト情報の開始
変換プログラムでは、この「{」でオブジェクト情報の開始を判定している。

nextFLAG:nextの有無を判定するフラグ
オブジェクト情報の初めに"txen"が書き込まれているかどうかの判定。
希望の森の黄オニヨンなどに、この"txen"が使われていることがある。基本的には手を加えない。

UNKNOWN_DATA2:不明データ2
「UNKNOWN_DATA1」と同様。

COMMENT:コメントデータ
そのオブジェクトに関するコメントを記入する場所。
コメントの開始を「CM_S{"」、終わりを「"}CM_E」で判定していることに注意。

POINT_SAYUU
POINT_JYOUGE
POINT_OKUYUKI
オブジェクトの配置位置に関する値。十六進数で編集を行う。

POINT_UNKNOWN1
POINT_UNKNOWN2
POINT_UNKNOWN3
値を変更してもこれといった変化が見受けられなかったため、このデータの役割は未だ不明である。

OBJECT_TYPE:オブジェクトの種類
そのオブジェクトが原生生物(teki)を扱うのか、それともペレットやパーツ類(pelt)を扱うのかといった、
"どんなものを用いるか"を定義するための半角英数字4文字。

ここからは「オブジェクトの種類」に応じてデータの記述内容が異なる。
まだ全てのデータを検証した訳ではないので部分的に紹介を行うことにする。


オブジェクトの種類が"pelt"である場合
PELT_TYPE:ペレット・パーツの種類。半角英数字4文字で記入。
ペレット・パーツの種類については下記の「peltリスト」を参照。


オブジェクトの種類が"item"である場合
ITEM_TYPE_DATA
ITEM_NAME
RAW_DATA
p00
p01
p02
p03
未検証。ドルフィン号・オニヨン・壁のデータであることは間違いない。


オブジェクトの種類が"piki"である場合
p00
ピクミンの状態を表す。埋まっている状態(0x00000000)、そのまま待機している状態(0x00000001)、
ステージ開始直後に隊列へ含まれる状態(0x00000002)の三つの種類が存在するようだ。

p01
ピクミンの種類を表しており、数値は青(0x0000000)、赤(0x00000001)、黄(0x00000002)の三つが存在している。
どーでもいいが、ピクミンは開発初期に「ピキ(piki)」とか呼ばれていたそうな。
コメントデータ内で見られる原生生物の「壁くい虫」や「丸のみ」といった名称もその一つなのかもしれない。


オブジェクトの種類が"teki"である場合
TEKI_BtFLAG:バイト数判定フラグ
テストデータなどの極一部に、バイト数が異なるデータが存在するのでこのフラグを作成した。
基本的にはいじらないこと。

TEKI_TYPE:原生生物の種類を定義するデータ
このデータを編集して原生生物の種類を決める。
種類に関しては下記の「tekiリスト」を参照。

TEKI_UNKNOWN:不明
ペレット草の色を固定したい場合は、このデータを使って色を決める。
青:TEKI_UNKNOWN:"0x0000"
赤:TEKI_UNKNOWN:"0x0001"
黄:TEKI_UNKNOWN:"0x0002"
水色(無効なペレット):TEKI_UNKNOWN:"0x0003"

TEKI_ITEM:原生生物が所有しているもの
何も持っていない場合は"none"、パーツ等を持たせる場合は「peltリスト」と同様の半角英数字4文字を記入。

TEKI_UnFLAG:不明データ用のフラグ
「TEKI_BtFLAG」と殆ど同様。手を加えないこと。

TEKI_UNKNOWN2_1
TEKI_UNKNOWN2_2
TEKI_UNKNOWN2_3
TEKI_UNKNOWN2_4
TEKI_UNKNOWN2_5
TEKI_UNKNOWN2_6
未検証のため不明。
ペレット草を指定した場合、「TEKI_UNKNOWN2_2」はランダム(0x00000000)か固定(0x00000001)かを決め、
「TEKI_UNKNOWN2_1」はペレット草の向きを決める用途があるようだ。


オブジェクトの種類が"boss"である場合
BOSS_DATA:巨大原生生物の指定
この値を編集して、配置する巨大原生生物などの定義を行う。
値と種類については「bossリスト」を参照すること。


以下からは全種類のオブジェクトで共通するものと思われる。

PARAMETER_TYPE:パラメーターの種類
"pint"と"circ"の二つが存在する。

"pint"である場合

"circ"である場合
CIRC_DATA:不明
p00:不明


01one:である場合
b00
b01
p00
p01
p02
01one内のp01は"オブジェクトの向き"を表し、値を+するほど左回転する。
それ以外は未検証。


aton:である場合
b00
b01
p00
未検証。


}:オブジェクト情報の終了

★_END:GENinfoファイルの終了







~peltリスト~
名称 GENinfo内でのデータ コメント内での名称
青ペレット(1) PELT_TYPE:"pb01"
青ペレット(5) PELT_TYPE:"pb05"
青ペレット(10) PELT_TYPE:"pb10"
青ペレット(20) PELT_TYPE:"pb20"
赤ペレット(1) PELT_TYPE:"pr01"
赤ペレット(5) PELT_TYPE:"pr05"
赤ペレット(10) PELT_TYPE:"pr10"
赤ペレット(20) PELT_TYPE:"pr20"
黄ペレット(1) PELT_TYPE:"py01"
黄ペレット(5) PELT_TYPE:"py05"
黄ペレット(10) PELT_TYPE:"py10"
黄ペレット(20) PELT_TYPE:"py20"
グルーオンドライブ PELT_TYPE:"ust1"
バウスプリット PELT_TYPE:"ust2"
ノンダイオキシン PELT_TYPE:"ust3"
永久燃料ダイナモ PELT_TYPE:"ust4"
メインエンジン PELT_TYPE:"ust5"
宇宙ムセン PELT_TYPE:"uf01"
気まぐれなレーダー PELT_TYPE:"uf02"
ガードサテライト PELT_TYPE:"uf03"
クロノスリアクター PELT_TYPE:"uf04"
放射線キャノピー PELT_TYPE:"uf05"
ガイガーカウンター PELT_TYPE:"uf06"
サジタリウス PELT_TYPE:"uf07"
リブラ PELT_TYPE:"uf08"
オメガスタビライザー PELT_TYPE:"uf09"
オメガスタビライザー PELT_TYPE:"uf10"
イオニウムジェット2 PELT_TYPE:"uf11"
ショックアブゾーバー PELT_TYPE:"un01"
グラビティジャンパー PELT_TYPE:"un02"
パイロットのいす PELT_TYPE:"un03"
ノヴァブラスター PELT_TYPE:"un04"
オートマチック・ギア PELT_TYPE:"un05"
ジルコニウムローター PELT_TYPE:"un06"
ただものではないネジ PELT_TYPE:"un07"
リペアTYPEネジ PELT_TYPE:"un08"
スペースフロート PELT_TYPE:"un09"
マッサージマシン PELT_TYPE:"un10"
へそくり金庫 PELT_TYPE:"un11"
ポジトロン発電機 PELT_TYPE:"un12"
アナログコンピュータ PELT_TYPE:"un13"
UVランプ PELT_TYPE:"un14"






~tekiリスト~
名称 GENinfo内でのデータ コメント内での名称
イモガエル TEKI_TYPE:"0x00000000"
イワゲン TEKI_TYPE:"0x00000001"
ゴロゴロ岩 TEKI_TYPE:"0x00000002"
コチャッピー TEKI_TYPE:"0x00000003"
チャッピー TEKI_TYPE:"0x00000004"
ピキマキ TEKI_TYPE:"0x00000005"
(不明) TEKI_TYPE:"0x00000006"
ペレット草 TEKI_TYPE:"0x00000007"
パンモドキ TEKI_TYPE:"0x00000008"
ボケナメコ TEKI_TYPE:"0x00000009"
ヤマシンジュ TEKI_TYPE:"0x0000000A"
サライムシ TEKI_TYPE:"0x0000000B"
パンモドキの巣 TEKI_TYPE:"0x0000000C"
ヤマシンジュの真珠 TEKI_TYPE:"0x0000000D"
ヤマシンジュの真珠(パーツ持ち) TEKI_TYPE:"0x0000000E"
ブタドックリ TEKI_TYPE:"0x0000000F"
フーセンドックリ TEKI_TYPE:"0x00000010"
フタクチドックリ TEKI_TYPE:"0x00000011"
ウジンコ(♀) TEKI_TYPE:"0x00000012"
ウジンコ(♂) TEKI_TYPE:"0x00000013"
トビンコ TEKI_TYPE:"0x00000014"
ドドロ TEKI_TYPE:"0x00000015"
ドドロ(卵なし) TEKI_TYPE:"0x00000016"
間欠炎 TEKI_TYPE:"0x00000017" 火柱
ミウリン TEKI_TYPE:"0x00000018"
オタマ TEKI_TYPE:"0x00000019"
(フリーズ) TEKI_TYPE:"0x0000001A"
(フリーズ) TEKI_TYPE:"0x0000001B"
(フリーズ) TEKI_TYPE:"0x0000001C"
(フリーズ) TEKI_TYPE:"0x0000001D"
ダンゴナマズ TEKI_TYPE:"0x0000001E"
チビクマ TEKI_TYPE:"0x0000001F"
クマチャッピー TEKI_TYPE:"0x00000020"
マロガエル TEKI_TYPE:"0x00000021"
(これ以降の値はフリーズ) TEKI_TYPE:"0x00000022"






~bossリスト~
名称 GENinfo内でのデータ コメント内での名称
ダマグモ BOSS_DATA:"0x00000000"
ヘビガラス BOSS_DATA:"0x00000001"
ミズモチ BOSS_DATA:"0x00000002"
ダイオウデメマダラ BOSS_DATA:"0x00000003"
コガネムシ BOSS_DATA:"0x00000004"
ポンガシグサ BOSS_DATA:"0x00000005"
ダイオウデメマダラ(背中のみ) BOSS_DATA:"0x00000006"
ヘビガラス BOSS_DATA:"0x00000007"
間欠泉(閉) BOSS_DATA:"0x00000008"
間欠泉(開) BOSS_DATA:"0x00000009"
(不明) BOSS_DATA:"0x0000000A"
ダマグモ(チャレンジモード) BOSS_DATA:"0x000004E0"






~ステージリスト~
名称 フォルダ名
遭難地点 practice
希望の森 stage1
樹海のヘソ stage2
大水源 stage3
最後の試練 last
遭難地点(チャレンジモード) chal0
希望の森(チャレンジモード) chal1
樹海のヘソ(チャレンジモード) chal2
大水源(チャレンジモード) chal3
最後の試練(チャレンジモード) chal4






現在把握しているのはこの程度だが、新たに判明したことや
プログラムの修正時に何かあれば追記を行うかもしれない。